package com.sunrise.comunicacao.repositorio;

import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.sunrise.comunicacao.repositorio.iface.ComunicacaoSMSDao;
import com.sunrise.generico.acesso.DaoService;
import com.sunrise.generico.entidade.ComunicacaoSMS;
import com.sunrise.generico.visao.Filtro;

@Repository
public class ComunicacaoSMSDaoImpl extends DaoService<ComunicacaoSMS> implements ComunicacaoSMSDao {

	public List<ComunicacaoSMS> listarOrdenado() {
		List<ComunicacaoSMS> list = listar(ComunicacaoSMS.class);
		Collections.sort(list, new Comparator<ComunicacaoSMS>() {

			@Override
			public int compare(ComunicacaoSMS o1, ComunicacaoSMS o2) {
				return o1.getNome().compareTo(o2.getNome());
			}
		});
		return list;
	}

	public List<ComunicacaoSMS> search(ComunicacaoSMS ex) {
		List<ComunicacaoSMS> list =  searchByExample(ComunicacaoSMS.class, ex);
		Collections.sort(list, new Comparator<ComunicacaoSMS>() {

			@Override
			public int compare(ComunicacaoSMS o1, ComunicacaoSMS o2) {
				return o1.getNome().compareTo(o2.getNome());
			}
		});
		return list;
	}

	public ComunicacaoSMS getById(Long id) {
		return getById(id, ComunicacaoSMS.class);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ComunicacaoSMS> listarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(ComunicacaoSMS.class);
		crit.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE));
		return crit.list();
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public Collection<ComunicacaoSMS> buscarPorFiltros(Filtro filtro) {
		Criteria crit = getSession().createCriteria(ComunicacaoSMS.class);
		if (filtro.getNome() != null) {
			crit.add(Restrictions.ilike("nome", filtro.getNome(),
					MatchMode.ANYWHERE));
		}
		
		if(filtro.getDataInicio() != null){
			crit.add(Restrictions.ge("dataEnvio", filtro.getDataInicio()));
		}
		
		if(filtro.getDataFim() != null){
			crit.add(Restrictions.le("dataEnvio", filtro.getDataFim()));
		}
		
		if(filtro.getConta() != null && filtro.getConta() != 0){
			crit.createAlias("contaSms", "conta");
			crit.add(Restrictions.eq("conta.id", filtro.getConta()));
		}
		
		if (filtro.getAtivo() != null) {
			crit.add(Restrictions.eq("ativo", filtro.getAtivo().getCodigo()));
		}
		
		crit.addOrder(Order.asc("nome"));
		return crit.list();
	}
	
	@Override
	public ComunicacaoSMS buscarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(ComunicacaoSMS.class);
		crit.add(Restrictions.eq("nome", nome).ignoreCase());
		return (ComunicacaoSMS) crit.uniqueResult();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ComunicacaoSMS> buscarComunicacaoSMSPorNome(String[] nomes) {
		Criteria crit = getSession().createCriteria(ComunicacaoSMS.class);
		Disjunction or = Restrictions.disjunction();
		crit.add(or);
		for(String nome : nomes){
			or.add(Restrictions.eq("nome", nome).ignoreCase());
		}
		return crit.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public Collection<ComunicacaoSMS> listarPorCelularDestinatario(String celular) {
		Criteria crit = getSession().createCriteria(ComunicacaoSMS.class);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.add(Calendar.DAY_OF_YEAR, -7);
		crit.add(Restrictions.ge("dataEnvio", calendar.getTime()));
		crit.createAlias("destinatarios", "dest");
		crit.add(Restrictions.eq("dest.celular", celular));
		return crit.list();
	}

}
